package com.dubbo;

/**
 * @author caoqianhuan
 * @date 2022/9/30
 * @Description: 最荣毅想到的办法是 相减统计次数； 但每次相减可能造成循环次数过多
 * 可以 每次相减成功后 就将被减数 扩大 减少可以适当减少 减法运算的次数
 * 由于题目限制 考虑边界溢出的情况 如 -2^31 / -1 = 2 ^ 31 溢出 返回 2 ^ 31 -1
 * 考虑正负 同号相除 则相减 异号相处则相加
 */
public class MyDividor {
    public int divide(int dividend, int dividor) {

        if (dividend == Integer.MIN_VALUE) {
            if (dividor == 1) {
                return Integer.MIN_VALUE;
            }
            if (dividor == -1) {
                return Integer.MAX_VALUE;
            }
        }
        boolean flag = true;
        if ((dividend < 0 && dividor > 0) || (dividend > 0 && dividor < 0)) {
            dividor = dividor * -1;
            flag = false;
        }
        int times = 0;
        int count = 0;
        while (true) {
            if (dividend >= dividor && times >= 0) {
                dividend -= dividor;
                count = count + (1 << times);
                dividor = dividor << 1;
                times++;
            } else if (dividend < dividor && times > 0) {
                dividor = dividor >> 1;
                times--;
            } else {
                return flag ? count : -1 * count;
            }
        }
    }

    public static void main(String[] args) {
        //int a = Integer.MAX_VALUE;
        //System.out.println(a);
        //a = a+1;
        //System.out.println(a);
        //System.out.println(2 << 0);
        MyDividor myDividor = new MyDividor();
        System.out.println(myDividor.divide(Integer.MIN_VALUE, 1));

        System.out.println(myDividor.divide(-10, 3));
    }
}
